package main

import "fmt"

//array数组 
//数组是值类型 var 数组名 [元素个数]T
//存放元素的容器，必须指定存放元素的类型和容量(长度),且数组的长度是数组类型的一部分
//数组包含元素的类型和元素的个数。元素的个数属于数据类型的一部分
func main(){
	var a1 [3]bool //[true\false\true] 声明一个变量a1，它是[3]bool类型
	var a2 [4]bool //[true\false\true\false]
	fmt.Printf("a1:%T a2:%T\n",a1,a2)
	//数组的初始化
	//如果不初始化，默认元素都是零值(布尔值:false，整型和浮点型都是0，字符串:"")
	fmt.Println(a1,a2)
	//1、数组初始化方法1  定义时使用初始值列表的方式初始化
	var ages [30]int
	ages =[30]int{1,2,3,4}
	fmt.Println(ages)
	//2、数组初始化方法2  编译器推导数组的长度
	//a100:=[10]int{1,2,4,5,7,4,7,9,2,4,6} //根据数组的长度判断数组的值 (声明一个变量并初始化)
	a100:=[...]int{4,6,7} //三个点代表根据数组值判断数组的长度
	var a101 =[...]int{1,2,3,4} //a100 := [...]int{1,2,3,4}等价于 var a101=[...]int{1,2,3,4}
	fmt.Println(a100)
	fmt.Println(a101)
	//3、根据索引值初始化
	a3 := [5]int{0:1,4:2}
	fmt.Println(a3)
	//数组遍历方法1，根据索引遍历
	citys := [...]string{"北京","上海","广州"}
	for i:=0;i<len(citys);{
		fmt.Println(citys[i])
		i++
	}
	//数组遍历方法2，根据for range遍历
	for i,v:=range citys{
		fmt.Println(i,v)
	}
	//多维数组 [[1,2] [3,4] [5,6]]
	var a11 [3][2]int
	a11 =[3][2]int{
		[2]int{1,2},
		[2]int{3,4},
		[2]int{5,6},
	}
	var a12 =[...][2]int{ //多维数组中只有最外层的可以为...
		[2]int{1,2},
		[2]int{3,4},
		[2]int{5,6},
	}
	fmt.Println(a11)
	fmt.Println(a12)
	// 二维数组遍历
	for _,v1:=range a11{
		fmt.Println(v1)
		for _,v2:=range v1 {
			fmt.Println(v2)
		}
	}
	//数组是值类型
	b1 := [3]int{1,2,3}
	b2 :=b1
	b2[0]=100
	fmt.Println(b1,b2)

	//复习 调用函数
	x:=[...]int{1,2,3}
	fmt.Println(x) //[1,2,3]
	f1(x)
	fmt.Println(x) //[1,2,3]
}
func f1(a [3]int){ 
	//go语言中的函数传递的都是值
	a[1]=100 //此处修改的是x副本的，即修改的是a [3]int的值，并不影响x的值
	fmt.Println(a) //[1,100,3]
}